package logiexport.bd;


import java.io.Serializable;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import logiexport.pojos.Presupuesto;
import logiexport.pojos.Producto;
import logiexport.pojos.User;
import logiexport.session.SignInSession;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;



public class App implements Serializable {
	

	private AnnotationConfiguration config;
	private SessionFactory factory;
	
	
	
	public App() {
		super();
		// TODO Auto-generated constructor stub
		
		config = new AnnotationConfiguration();
		config.addAnnotatedClass(Presupuesto.class);
		config.addAnnotatedClass(Producto.class);
		config.addAnnotatedClass(User.class);
		config.configure();
		factory = config.buildSessionFactory();	
		
			
	}




	public List<Producto> productos () {
		
		
		System.out.println("-----Dentro de producto:");
		
		Session session = factory.openSession();
		session.beginTransaction();		
		
		ArrayList<Producto> listameets = new ArrayList<Producto>();
		
		Query query = session.createQuery("from Producto");
		
		
		session.getTransaction().commit();		
	
			
		List result = query.list();
		
		for (Iterator <Producto> iterator = result.iterator();iterator.hasNext();){
			
			System.out.println("dentro");
			Producto m =  iterator.next();
			
			
			System.out.println("m:"+m.getNombre());
			listameets.add(m);
			

		}
		
		session.close();
		return listameets;
		
		
		
	} 
	
	public void adduser (User u) {
		
		System.out.println("Dentro de add1");
		Session sesion = factory.openSession();
		sesion.beginTransaction();
		System.out.println("Dentro de add");
		
		System.out.println("Pass de add"+u.getPass());
		
		 u.setPass(convert_md5(u.getPass()));
		//u.setPass());		
		
		sesion.save(u);
		System.out.println("Dentro de add2");
		
		sesion.getTransaction().commit();
		sesion.close();
		
		
		
	} 
	
	public User login (String email, String password){
		
		
		Session sesion = factory.openSession();
		sesion.beginTransaction();
		
		System.out.println("1");
		
		Query q = sesion.createQuery("from User where email = '"+email+"'");
		
		User s =(User) q.uniqueResult();
		
	//	password= convert_md5(password);
		
		System.out.println("PAssword: "+password);
		
		
		if(s != null) {
			
			if(s.getPass().equals(password)) {
				
				
				User usuario = s;
				
				for(int i=0; i<s.getPresupuestos().size();i++) {
					
					System.out.println("Dentro del for i:"+i);
					
					s.getPresupuestos().get(i).getProductos();
					
					usuario.getPresupuestos().get(i).getProductos().get(0);
					
					for(int j=0; j<usuario.getPresupuestos().get(i).getProductos().size();j++){
						
						usuario.getPresupuestos().get(i).getProductos().get(j);
						
					}
					
					
				} 
				
			
				sesion.close();
				return usuario;
			}
			else {
				
				System.out.println("ko");
				sesion.close();			
				return null;
				
			}
			
			
		}
		
		else {
			
			return null;
			
		}	
		
	
		
	}
	
	public int last_presupuesto () {
		
		
		System.out.println("----Last presupuesto");
		
		Session sesion = factory.openSession();
		sesion.beginTransaction();
		
		Query q = sesion.createQuery("select max(id_p) from Presupuesto");
		System.out.println("----lp 1");
		
		if(q.uniqueResult()==null){
			
			System.out.println("Esta vacio");
			return 0;
			
		}
		else {
			
			int id =(Integer) q.uniqueResult();			
			System.out.println("id_p"+id);
			return id;
			
		}
			
	
	}
	
	public Presupuesto presu (Presupuesto p) {
		
		System.out.println("Presu");
		Session sesion = factory.openSession();
		sesion.beginTransaction();	
		
		
		Query q = sesion.createQuery("from Presupuesto where id_p="+p.getId_p());
		
		
		Presupuesto presu =(Presupuesto) q.uniqueResult();
		
		sesion.getTransaction().commit();
		sesion.close();
		
		return presu;
		
		
		
	}
	
	public void add_presu (User u, Presupuesto p) {
		
		SignInSession s = SignInSession.get();		
		
		System.out.println("AddPresu");
		Session sesion = factory.openSession();
		sesion.beginTransaction();
		User usuario = new User();
		sesion.load(usuario, u.getId_u());
		
		usuario.getPresupuestos().add(p);
		
		sesion.update(usuario);
		sesion.getTransaction().commit();
		
		
		//Añadimos el presupuesto tbn al usuario de la session.
		//s.getUser().getPresupuestos().add(p);
		
		sesion.close();		
		
		
		
				
	} 
	
	 public List<Presupuesto> lista_presu (User u) {
		
				
		System.out.println("Dentro de lista presu ?¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿");
		
		Session sesion = factory.openSession();
		sesion.beginTransaction();
		
		Query q = sesion.createQuery("select presupuestos from User where id_u="+u.getId_u()+" AND hidden is false");
				
		List result =q.list();
		
		System.out.println("El tamaño de la lista es :"+result.size());
		
		List<Presupuesto> listapresus =  new ArrayList<Presupuesto>();
		
		for (Iterator <Presupuesto> iterator = result.iterator();iterator.hasNext();) {
			
			 Presupuesto presupuesto = (Presupuesto) iterator.next(); 
			 
			 listapresus.add(presupuesto);
			
			
		}
		
		return listapresus;

		
		
		
	}
	 
	 public List<Integer> lista_idspresu (User u) {
			
			
		System.out.println("Dentro de lista presu ?¿¿¿¿¿¿¿¿¿¿¿¿¿¿¿");
		
		Session sesion = factory.openSession();
		sesion.beginTransaction();
		
		Query q = sesion.createQuery("select presupuestos from User where id_u="+u.getId_u()+" AND hidden is false");
				
		List result =q.list();
		
		System.out.println("El tamaño de la lista es :"+result.size());
		
		List<Integer> listapresus =  new ArrayList<Integer>();
		
		for (Iterator <Presupuesto> iterator = result.iterator();iterator.hasNext();) {
			
			 Presupuesto presupuesto = (Presupuesto) iterator.next(); 
			 
			 listapresus.add(presupuesto.getId_p());
			
			
		}
		
		return listapresus;

		
		
		
	}
	
	public void hidden (Presupuesto p) {
		
		System.out.println("App: Visible");
		Session sesion = factory.openSession();
		sesion.beginTransaction();
		
		sesion.load(p, p.getId_p());
		
		p.setHidden(true);
		
		sesion.update(p);
		sesion.getTransaction().commit();
		sesion.close();
		
		
		
	}
	
	public String convert_md5 (String passwordToHash) {
		
		 System.out.println("Dentro de convert_md5: "+passwordToHash);
		
        String generatedPassword = null;
        try {
            // Create MessageDigest instance for MD5
            MessageDigest md = MessageDigest.getInstance("MD5");
            //Add password bytes to digest
            md.update(passwordToHash.getBytes());
            //Get the hash's bytes 
            byte[] bytes = md.digest();
            //This bytes[] has bytes in decimal format;
            //Convert it to hexadecimal format
            StringBuilder sb = new StringBuilder();
            for(int i=0; i< bytes.length ;i++)
            {
                sb.append(Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1));
            }
            //Get complete hashed password in hex format
            generatedPassword = sb.toString();
        } 
        catch (NoSuchAlgorithmException e) 
        {
            e.printStackTrace();
        }
        
        System.out.println("MD5: "+generatedPassword);
        
        return generatedPassword;
        
			
}
	
	

}
